; 
;                   FILE-EXT.A86 Version 1.0
;
;                           as of
;
;                     March 29, 1982  
; 
;
;
;  Originally  named  FILES.ASM,  and  from a  disassembly  by 
; "J.A.P"  of January 23,1980...FILE-EXT.A86 will display  the 
; selected disk's directory entries in the form:
; 
; User Pro Filename.Typ R/OSysRes exs1s2rc <---------Group--------->
; ==================================================================
;
; Where:
;
; "User" is the User assignment for the file.
; "Pro" is the "proprietary software" control bit.
; "Filename" is the ASCII file name.
; "Typ" is the ASCII file type.
; "R/O" is the "read only" control bit
; "Sys" is the "system directory" control bit
; "Res" is the "reserved" (MP/M Ver.1.0) control bit
; "ex" is the "file extension" byte
; "s1" is a CP/M "internal function" byte.
; "s2" is a CP/M "internal function" byte
; "rc" is the "record count" byte.
; "Group" is the "allocation vector table" for the file.
; 
;  The "hack-job" I did on this one was less than  ideal,  but 
; none the less, it get's the job done...the display format is 
; now  alot  cleaner,  and  it  does'nt  "warm  boot"  as  the 
; FILES.ASM version did...
; 
;  The  program will display the disk directory of the  logged 
; on  disk,  including all the Hexadecimal information on  the 
; groups. 
; 
;  On  the  subject  of  "hack-job's"  of  software,  read  an 
; interesting  article  in  Psychology  Today  magazine,  "The 
; Hacker  Papers;  Computer  Addiction:  Reflection on  a  New 
; Obsession"...August 1980 issue, pages 62-69.
; 
;                               Best regards,
; 
;                               Kelly Smith, CP/M-NET (tm)
;                               805-527-9321 (Modem, 300 Baud)
;                               805-527-0518 (Verbal)
; 
	ORG	0100H

M	EQU	BYTE PTR 0[BX]

BDOS	EQU	05H
TBUFF	EQU	80H
;
CR	EQU	0DH			;ASCII CARRIAGE RETURN
LF	EQU	0AH			;ASCII LINE FEED
;
;
	JMP	BEGIN			;IF VERSION O.K., PRESS ON
;
;	SYSTEM SUBROUTINES
;
;	PRINT STRING FROM D&E REGS.
;
PRINT:	MOV	CL,9
	INT	224
	RET
;
;	DISPLAY A CHAR FROM (A)
;
DISPLAY:
	PUSH	CX
	PUSH	DX
	PUSH	BX
	MOV	CL,2
	MOV	DL,AL
	INT	224			;
	POP	BX
	POP	DX
	POP	CX
	RET
;
;	SEARCH FOR A FILE
;
SEARCH:				; 
	PUSH	CX
	PUSH	DX
	PUSH	BX
	MOV	CL,11H
	MOV	DX,(Offset AFN)		;
	INT	224			;
	MOV	Byte Ptr RESULT,AL	;
	POP	BX
	POP	DX
	POP	CX
	RET
L_2	EQU	$
	DSEG
	ORG	Offset L_2
;
;	AMBIGUOUS FILENAME.TYP
;
AFN	RS	0			; 
	DB	'?????????????'
RESULT	RS	0			; 
	DB	0			;STORAGE FOR RESULT OF BDOS CALL
L_3	EQU	$
	CSEG
	ORG	Offset L_3
;
;	FIND NEXT OCCURRENCE OF FILE
;
NEXTFILE:				; 
	PUSH	CX
	PUSH	DX
	PUSH	BX
	MOV	CL,12H
	MOV	DX,(Offset AFN)		;
	INT	224			;
	MOV	Byte Ptr RESULT,AL	;
	POP	BX
	POP	DX
	POP	CX
	RET
;
;	GET INPUT FROM CONSOLE
;
CONIN:					; 
	PUSH	CX
	PUSH	DX
	PUSH	BX
	MOV	CL,1
	INT	224			;
	POP	BX
	POP	DX
	POP	CX
	RET
;
;	CONVERT A BYTE IN (A) TO TWO PRINTED CHARACTERS
;
HEXASC:				; 
	CMP	AL,0AH
	JB	HEXA2			;
	ADD	AL,'7'			;
	CALL	DISPLAY			;
	RET
HEXA2:					; 
	ADD	AL,'0'			;
	CALL	DISPLAY			;
	RET
HEXCON:				; 
	LAHF
	XCHG	AL,AH
	PUSH	AX
	XCHG	AL,AH
	RCR	AL,1
	RCR	AL,1
	RCR	AL,1
	RCR	AL,1
	AND	AL,0FH
	CALL	HEXASC			;
	POP	AX
	XCHG	AL,AH
	AND	AL,0FH
	CALL	HEXASC			;
	RET
;
;	NEWLINE
;
CRLF:					; 
	MOV	AL,CR
	CALL	DISPLAY			;
	MOV	AL,LF
	CALL	DISPLAY			;
	RET
;
;	PRINT A SPACE
;
SPACE:					; 
	MOV	AL,' '			;
	CALL	DISPLAY			;
	RET
;
;	MAIN WORK LOOP
;
;	THIS ROUTINE FINDS THE POSITION OF THE FILE
;	INFORMATION IN THE DIRECTORY DMA, PRINTS THE
;	DATA IF IT IS A CURRENT FILE, AND PROMPTS THE
;	OPERATOR FOR INSTRUCTIONS IF THE FILENAME HAS
;	ILLEGAL (NON-ASCII) DATA IN IT.
;
WORKLOOP:				; 
	MOV	AL,Byte Ptr RESULT	;RESULT HOLDS POSITION OF-
	MOV	CH,AL			; -THE DIRECTORY ENTRY IN THE DIR. DMA
	AND	AL,3
	RCL	AL,1
	RCL	AL,1
	RCL	AL,1
	RCL	AL,1
	RCL	AL,1
	AND	AL,0E0H
	MOV	DL,AL
	MOV	DH,0
	MOV	BX,TBUFF		;
	ADD	BX,DX			;HL NOW POINTS AT THE FILE INFO
	MOV	AL,M
	CMP	AL,0E5H			;KILLED FILE?
	JNZ	L_4	
	RET				;YES
L_4:
	CALL	SPACE			;SPACE OVER FOR NEATNESS
	MOV	AL,M
	CALL	HEXCON			;PRINT USER NUMBER
	CALL	SPACE
	CALL	SPACE
	CALL	SPACE
	PUSH	BX
	PUSH	BX
	LAHF				;POINT TO FIRST CHARACTER IN FILE NAME
	INC	BX
	SAHF
	MOV	AL,M			;ALLOW HIGH BIT SET FOR "PROPRIETARY SOFTWARE"
	ROL	AL,1			;TEST "PROPRIETARY SOFTWARE" BIT
	MOV	AL,'1'
	JB	WORK01
	MOV	AL,'0'
WORK01:	CALL	DISPLAY
	CALL	SPACE
	CALL	SPACE
	CALL	SPACE
	MOV	CH,8
WORK02:	MOV	AL,M			;PRINT FILE NAME
	AND	AL,07FH			; STRIP-OFF PARITY BIT
	CALL	DISPLAY			;
	DEC	CH
	LAHF
	INC	BX
	SAHF
	JNZ	WORK02			;
	MOV	CH,3
	MOV	AL,'.'
	CALL	DISPLAY			;PRINT NEXT THREE CHARACTERS AS ASCII
WORK03:	MOV	AL,M
	AND	AL,07FH			; STRIP-OFF PARITY BIT
	CALL	DISPLAY			;
	DEC	CH
	LAHF
	INC	BX
	SAHF
	JNZ	WORK03			;
	CALL	DISPLAY
	CALL	SPACE
	MOV	CH,3
	POP	BX			;NOW DISPLAY ATTRIBUTES
	MOV	DX,9
	LAHF
	ADD	BX,DX
	RCR	SI,1
	SAHF
	RCL	SI,1
WORK03A:CALL	SPACE
	MOV	AL,M
	ROL	AL,1			;TEST $SYS AND $R/O, AND RESERVED
	MOV	AL,'1'
	JB	WORK03B
	MOV	AL,'0'
WORK03B:CALL	DISPLAY
	CALL	SPACE
	DEC	CH
	LAHF
	INC	BX
	SAHF
	JNZ	WORK03A
	MOV	CH,20
WORK04:	MOV	AL,CH
	AND	AL,3
	JNZ	L_5	
	CALL	SPACE			;
L_5:
	MOV	AL,M
	CALL	HEXCON			;
	LAHF
	INC	BX
	SAHF
	DEC	CH
	JNZ	WORK04			;
	CALL	CRLF			;
	POP	BX
	RET
L_6	EQU	$
	DSEG
	ORG	Offset L_6
;
BADVER	DB	'Sorry, CP/M Version 2.X required$'
MSG	DB	'User Pro  Filename.Typ R/OSysRes exs1s2rc'
	DB	' <--------------Group-------------->'
	DB	CR,LF
	DB	'========================================='
	DB	'===================================='
	DB	CR,LF,'$'
L_7	EQU	$
	CSEG
	ORG	Offset L_7
;
;
;
; ERROR MESSAGES
;
ERROR1:	MOV	DX,(Offset ERMSG1)	;SAY NO GO, AND BAIL OUT
	CALL	PRINT
	JMP	QUIT
L_8	EQU	$
	DSEG
	ORG	Offset L_8
;
ERMSG1	DB	CR,LF,'Disk select should be " N:"$'
L_9	EQU	$
	CSEG
	ORG	Offset L_9
;
ERROR2:	MOV	DX,(Offset ERMSG2)	;SAY NO GO, AND BAIL OUT
	CALL	PRINT
	JMP	QUIT
L_10	EQU	$
	DSEG
	ORG	Offset L_10
ERMSG2	DB	CR,LF,'Bad delimeter, should be ":"$'
L_11	EQU	$
	CSEG
	ORG	Offset L_11
;
ERROR3:	MOV	DX,(Offset ERMSG3)	;SAY NO GO, AND BAIL OUT
	CALL	PRINT
	JMP	QUIT
L_12	EQU	$
	DSEG
	ORG	Offset L_12
ERMSG3	DB	CR,LF,'No drive specified$'
L_13	EQU	$
	CSEG
	ORG	Offset L_13
;
ERROR4:	MOV	DX,(Offset ERMSG4)	;SAY NO GO, AND BAIL OUT
	CALL	PRINT
	JMPS	QUIT
L_14	EQU	$
	DSEG
	ORG	Offset L_14
ERMSG4	DB	CR,LF,'Only drives A to D allowed$'
L_15	EQU	$
	CSEG
	ORG	Offset L_15
;
;	PROGRAM BEGINS HERE
;
BEGIN:
;
; CHECK FOR DRIVE SPECIFICATION
;
	MOV	AL,Byte Ptr .TBUFF	;GET LENGTH OF COMMAND PARAMETERS
	CMP	AL,2			; IF <2, NO PARAMETERS
	JB	MAIN01			; MUST BE PRESENT LOGGED-IN DRIVE
	JNZ	L_16	
	JMP	ERROR1			;EXACTLY 2, IS ERROR
L_16:
	MOV	BX,Word Ptr .TBUFF+2	;AT LEAST 3 THEN...
	MOV	AL,BH			;NEXT CHARACTER SHOULD BE ":"
	CMP	AL,':'
	JZ	L_17	
	JMP	ERROR2			;ONLY ALLOW DRIVE SET
L_17:
	MOV	AL,BL			;NEXT CHARACTER SHOULD BE DRIVE
	CMP	AL,'A'			;AT A MINIMUM, "A"
	JB	ERROR3
	CMP	AL,'E'			;AT A MAXIMUM "D"
	JNB	ERROR4
	AND	AL,7			;STRIP BITS, FOR 0 TO 3
	DEC	AL			;BACK OFF FOR 0 TO 3
	MOV	DL,AL			;MAKE DISK NUMBER
	MOV	DH,0
	MOV	CL,14			;BDOS SELECT DISK FUNCTION
	INT	224
MAIN01:	MOV	DX,(Offset MSG)
	CALL	PRINT
	CALL	SEARCH			;
MAIN02:				; 
	MOV	AL,Byte Ptr RESULT	;
	CMP	AL,0FFH
	JZ	QUIT
	CALL	WORKLOOP		;
	CALL	NEXTFILE		;
	JMPS	MAIN02			;
QUIT:	MOV	CL,0	; WARM BOOT CP/M-86
	INT	224
;
L_18	EQU	$
	DSEG
	ORG	Offset L_18
;
;	SOME STORAGE LOCATIONS
;
OLDSTK	RS	2			;STORAGE FOR "OLD" STACK POINTER
	RS	32
NEWSTK	EQU	(Offset $)		;STORAGE FOR "NEW" STACK
;
;
	END
